package com.example.myonlinemusic.controller;

import com.example.myonlinemusic.mapper.LoveMusicMapper;
import com.example.myonlinemusic.mapper.MusicMapper;
import com.example.myonlinemusic.model.Music;
import com.example.myonlinemusic.model.User;
import com.example.myonlinemusic.tools.Constant;
import com.example.myonlinemusic.tools.ResponseBodyMessage;
import com.sun.org.apache.xpath.internal.operations.Bool;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.binding.BindingException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.w3c.dom.stylesheets.LinkStyle;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@RestController
@Slf4j
@RequestMapping("/music")
public class MusicController {
    //可以把这个路径封装到配置文件中
    @Value("${music.local.path}")
    private String SAVE_PATH;

    @Resource
    private LoveMusicMapper loveMusicMapper;
    @Resource
    private MusicMapper musicMapper;
    //MultipartFile文件上传的主要类
    @RequestMapping("/upload")
    public String insertMusic(@RequestParam String singer, @RequestParam("filename") MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws IOException {
        //获取一下session中的参数，看是否已经登录
        HttpSession httpSession = request.getSession(false);
        if(httpSession == null || httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null){
            log.info("您当前没有登录");

            return "请登录后再进行上传";
        }


        //获取音乐的文件名 例如xxx.mp3
        String fileNameAndType = file.getOriginalFilename();
        System.out.println("fileNameAndType: " + fileNameAndType);
        //歌名
        String title = fileNameAndType.substring(0,fileNameAndType.lastIndexOf("."));
//

        if(singer  == "" || "".equals(singer)){
            return "歌手名不能为空";
        }
        //最后的文件路径应该是要上传的路径加上文件名 需要给加个/表示这个新一级路径
        String path = SAVE_PATH + "/" +  fileNameAndType;
        File dest = new File(path);
        //需要看一下文件是否存在
        if(!dest.exists()){
            //如果没有目录 就进行创建
            dest.mkdir();
        }
        //此时再这里需要检验文件的格式是不是mp3文件，能不能播放，需要判断ID3V1.0标准里面的3个字节里面是不是TAG字符，如果有的话，表示这是一个MP3文件，否则就不是，不能通过后缀名进行判断
        //然后上传这个文件
        try {
            file.transferTo(dest);
            //return new ResponseBodyMessage<>(0,"上传成功",true);
        } catch (IOException e) {
            e.printStackTrace();
            return "服务器上传失败";
        }
        //return new ResponseBodyMessage<>(-1,"上传失败",false);
        //数据库的上传
        User user = (User) httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);
        int userid = user.getId();
        //此时的url表示音乐的播放地址，播放的时候是一个http请求是需要这个路径的，这里先自定义一下，后面再详细使用
        String url = "/music/get?path=" + title;

        Music music = musicMapper.selectByUrl(url);
        if(music != null){
            return "数据库中已经有这首歌了！";
        }
        //获取当前时间：
//        String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        String time = new SimpleDateFormat("yyyy-MM-dd").format(new Date());

        try{
            int ret = musicMapper.insert(title,singer,time,url,userid);
            if(ret == 1){
                log.info("上传成功");
                //这里上传成功，应该跳转到音乐列表
                response.sendRedirect("/list.html");
                return "数据库上传成功";
            }else{
                return "数据库上传失败";
            }
        }catch (BindingException e){
            //数据库上传失败，将之前的文件删掉，不要这个了（没有上传到数据库，但是文件放到服务器了，这里需要删掉）
            dest.delete();
            return "数据库上传失败";

        }





    }


    @RequestMapping("/get")
    public ResponseEntity<byte[]> get(String path){
        //从文件路径获取到文件
        File file = new File(SAVE_PATH + "/" + path);
        //将文件的字节文件放到字节数组中，以便返回
        byte[] bytes = null;
        try {
            bytes = Files.readAllBytes(file.toPath());
            //看是否有东西，没有东西表示没有这个音乐
            if(bytes == null){
                //没有音乐，返回一个400的状态
                return ResponseEntity.badRequest().build();
            }
            //此时表示有内容，返回body内容和200ok
            return ResponseEntity.ok(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ResponseEntity.badRequest().build();

    }
    //删除音乐
    @RequestMapping("/delete")
    public ResponseBodyMessage<Boolean> deleteMusicById(@RequestParam String id){
        //先从数据库中进行查询，看数据库中是否有这个音乐
        Music music = musicMapper.findMusicById(Integer.parseInt(id));

        //查看这个音乐是否存在
        if(music == null){
            //音乐不存在
            log.info("音乐不存在无法进行删除");
            return new ResponseBodyMessage<>(-1,"音乐不存在无法进行删除",false);
        }else {
            //先在数据库中进行删除，然后再在服务器上进行删除
            int ret = musicMapper.deleteMusicById(Integer.parseInt(id));

            if(ret == 1){
                //然后这里再进行删除服务器的操作
                String path = SAVE_PATH + "/" + music.getTitle() + ".mp3";
                File file = new File(path);
                if(file.delete()){
                    //此时就需要查看收藏列表里面是否有这首音乐，如果有就需要取消掉对这首音乐的收藏
                    loveMusicMapper.deleteLoveMusicByMusicId(music.getId());
                    return new ResponseBodyMessage<>(0,"删除成功",true);

                }else {
                    log.info("服务器删除音乐失败");
                    return new ResponseBodyMessage<>(-1,"服务器删除音乐失败",false);
                }
            }else{
                log.info("数据库删除音乐失败");
                return new ResponseBodyMessage<>(-1,"数据库删除音乐失败",false);
            }
        }


    }

    //批量删除音乐
    @RequestMapping("/deletesel")
    public ResponseBodyMessage<Boolean> deleteSelMusic(@RequestParam("id[]")List<Integer> id){
        System.out.println("所有的id：" + id);
        int sum= 0;
        for (int i = 0; i < id.size(); i++) {
            //先从数据库中进行查询，看数据库中是否有这个音乐
            Music music = musicMapper.findMusicById(id.get(i));

            //查看这个音乐是否存在
            if(music == null){
                //音乐不存在
                log.info(id.get(i) +  "音乐不存在无法进行删除");
                return new ResponseBodyMessage<>(-1,id.get(i) + "音乐不存在无法进行删除",false);
            }else {
                //先在数据库中进行删除，然后再在服务器上进行删除
                int ret = musicMapper.deleteMusicById(id.get(i));

                if(ret == 1){
                    //然后这里再进行删除服务器的操作
                    String path = SAVE_PATH + "/" + music.getTitle() + ".mp3";
                    File file = new File(path);
                    if(file.delete()){

                        //此时就需要查看收藏列表里面是否有这首音乐，如果有就需要取消掉对这首音乐的收藏
                        loveMusicMapper.deleteLoveMusicByMusicId(music.getId());

                        //return new ResponseBodyMessage<>(0,"删除成功",true);
                        sum += ret;
                    }else {
                        log.info(id.get(i) + "服务器删除音乐失败");
                        return new ResponseBodyMessage<>(-1,id.get(i) + "服务器删除音乐失败",false);
                    }
                }else{
                    log.info(id.get(i) + "数据库删除音乐失败");
                    return new ResponseBodyMessage<>(-1, id.get(i) + "数据库删除音乐失败",false);
                }
            }
        }
        if(sum == id.size()){
            return new ResponseBodyMessage<>(0,"批量删除成功",true);

        }else{
            log.info("批量删除失败");
            return new ResponseBodyMessage<>(-1,"批量删除失败",false);

        }
    }
    //required等于false表示可以传空值
    @RequestMapping("/findmusic")
    public ResponseBodyMessage<List<Music>> findMusic(@RequestParam(required = false) String title,HttpServletRequest request){
        List<Music> musicList = null;

        //从session中获得userId
        HttpSession httpSession = request.getSession(false);
        if(httpSession == null || httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null){
            log.info("您当前没有登录");

            return new ResponseBodyMessage<>(-1,"请登录后再进行查询",musicList);
        }
        if(title == null){
            //表示不传入参数，就查询所有的音乐
            musicList = musicMapper.findMusic();

        }else{
            //查询到指定的音乐列表 这是模糊匹配，可以不用输入完全
            musicList = musicMapper.findMusicByName(title);
        }
        return new ResponseBodyMessage<>(0,"查询成功",musicList);
    }
}
